#include <iostream>
#include <memory>
#include <cstdlib>
#include "ThreadPool.hpp"
#include "Log.hpp"
#include "Task.hpp"
using namespace std;
using ThreadModule::Thread;
int main()
{
    EnableScreen();
    ThreadPool<Task>::GetInstance();
    ThreadPool<Task>::GetInstance()->Start();
    sleep(2);
    int task = 3;
    while (task)
    {
        int a = rand() % 100;
        int b = rand() % 50;
        Task t(a, b);
        ThreadPool<Task>::GetInstance()->push(t);
        sleep(1);
        task--;
    }
    ThreadPool<Task>::GetInstance()->Stop();
    ThreadPool<Task>::GetInstance()->Wait();
    ThreadPool<Task>::DeleteInstance();

    // srand(time(nullptr) ^ getpid() ^ pthread_self());
    // // EnableScreen();
    // EnableFile();
    // unique_ptr<ThreadPool<Task>> tp = make_unique<ThreadPool<Task>>(g_defaultnum);
    // tp->InitThreads(); // 初始化线程池中的线程

    // tp->Start(); // 线程池中所有线程执行任务

    // int tasknum = 5;
    // while (tasknum)
    // {
    //     int a = rand() % 100;
    //     sleep(1);
    //     int b = rand() % 50;
    //     Task t(a, b);
    //     LOG(INFO, "thread pool push a task");
    //     tp->push(t);
    //     tasknum--;
    // }

    // sleep(1);   //让新线程把任务处理完，主线程再回收
    // tp->Stop(); // 

    // tp->Wait(); // 主线程等带线程池中所有线程

//     // // EnableScreen();
//     // // EnableFile();
//     // // Test(3, 1, 2 ,3);
//     // LOG(DEBUG, "hello world %d, %s", 10, "haha");
//     // LOG(DEBUG, "hello world %d, %s", 9, "haha");
//     // LOG(DEBUG, "hello world %d, %s", 8, "haha");
//     // LOG(DEBUG, "hello world");
//     // FUN();
//     // LogMessage(__FILE__,__LINE__, DEBUG, "hello world, %d, %c, %s", 1 ,'a', "hehe");
//     // LogMessage(__FILE__,__LINE__, DEBUG, "hello world");
//     // LogMessage(__FILE__,__LINE__, DEBUG, "hello world");

//     // C++14新语法 make_unique
//     // unique_ptr<ThreadPool<int>> tp = make_unique<ThreadPool<int>>(3);
//     //  tp->InitThreads();//初始化线程池中的线程

//     // tp->Start();//线程池中所有线程执行任务
//     // sleep(2);

//     // tp->Stop();

//     // tp->Wait(); //主线程等带线程池中所有线程

//     return 0;
}

// class A
// {
// public:
//     void Print()
//     {
//         cout << "haha" << endl;
//     }
// };
// int main()
// {
//     // A::Print(A());
//     function<void()> Print_Bind = bind(&A::Print, A());
//     Print_Bind();
// }
